﻿using System;
using System.Collections.Generic;

using System.Text;

namespace Rance.Battle
{
    class 战车AI : AI
    {
        public override AIResult Excute(角色 角色, 队伍状况 队伍状况, AI技能MGT 技能mgt)
        {
            AIResult result = new AIResult();

            #region 穿梭战场

            if (技能mgt.Has("穿梭战场"))
            {
                var 穿梭战场 = 技能mgt.Get("穿梭战场");

                var 守护list = 队伍状况.对手状态.队伍.成员List.FindAll(r => r.守护率 > 0 || r.全体守护率 > 0);

                //var 守护list = (from r in 队伍状况.对手状态.队伍.成员List
                //              where r.守护率 > 0 ||
                //                    r.全体守护率 > 0
                //              select r).ToList();
                if (守护list.Count >= 2)
                {
                    result.Action = 穿梭战场.Name;
                    result.TargetList = 穿梭战场.TargetList[0].List;

                    return result;
                }
                else if (守护list.Count > 0)
                {
                    if (守护list[0].守护率 >= 80 || 守护list[0].全体守护率 >= 50)
                    {
                        result.Action = 穿梭战场.Name;
                        result.TargetList = 穿梭战场.TargetList[0].List;

                        return result;
                    }
                    else if (守护list[0].守护率 >= 40 || 守护list[0].全体守护率 >= 30)
                    {
                        if (队伍状况.战场.AI乱数表.Hit(50))
                        {
                            result.Action = 穿梭战场.Name;
                            result.TargetList = 穿梭战场.TargetList[0].List;

                            return result;
                        }
                    }
                }
            }

            #endregion

            #region 千乘旋风

            if (技能mgt.Has("千乘旋风"))
            {
                var hit = false;
                if (角色.行动点 > 2)
                    hit = true;
                else if(角色.行动点 == 2)
                    hit = 队伍状况.战场.AI乱数表.Hit(50);

                if(hit)
                {
                    var 千乘旋风 = 技能mgt.Get("千乘旋风");
                    var targetList = ConvertSoloTarget(千乘旋风.TargetList);
                    List<角色> tempList = new List<角色>();
                    foreach (var item in targetList)
                    {
                        if (item.兵种.类型 == "步卒")
                            continue;

                        tempList.Add(item);
                    }

                    if (tempList.Count != 0)
                        targetList = tempList;

                    targetList.Sort((v1, v2) => v1.兵力.CompareTo(v2.兵力));
                    targetList.Reverse();

                    var target = targetList[0];

                    result.Action = 千乘旋风.Name;
                    result.TargetList.Add(target);
                    return result;
                }
            }

            #endregion

            #region 冲刺攻击

            var 冲刺攻击 = 技能mgt.Get("冲刺攻击");
            if (冲刺攻击 == null)
                return null;
            var 冲刺攻击target = GetTarget(ConvertSoloTarget(冲刺攻击.TargetList), 队伍状况);
            result.Action = 冲刺攻击.Name;
            result.TargetList.Add(冲刺攻击target);

            return result;

            #endregion
        }

        protected virtual 角色 GetTarget(List<角色> targetList, 队伍状况 队伍状况)
        {
            //优先攻击"准备中"的敌人
            var 准备角色List = 队伍状况.对手状态.队伍.成员List.FindAll(r => r.是否准备);
            if (准备角色List.Count > 0)
            {
                准备角色List.Sort((v1, v2) => v1.兵力.CompareTo(v2.兵力));
                准备角色List.Reverse();

                return 准备角色List[0];
            }

            List<角色> tempList = new List<角色>();
            foreach (var item in targetList)
            {
                if (item.兵种.类型 == "步卒")
                    continue;

                tempList.Add(item);
            }

            if (tempList.Count != 0)
                targetList = tempList;

            if (targetList.Count == 1)
                return targetList[0];
            else
            {
                var value = 队伍状况.战场.AI乱数表.Random(0, targetList.Count);
                return targetList[value];
            }
        }

        private static 战车AI instance = new 战车AI();
        public static 战车AI GetInstance()
        {
            return instance;
        }
    }
}
